package com.dingreading.cloud.soms.service;

import com.dingreading.cloud.common.util.PageUtil;
import com.dingreading.cloud.soms.dto.CaCallNamesDto;
import com.dingreading.cloud.soms.entity.CaCallNames;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 服务层。
 *
 * @author Administrator
 * @since 2023-11-22
 */
public interface CaCallNamesService extends IService<CaCallNames> {

    Page<CaCallNamesDto> pageList(
            PageUtil pageUtil, String storeUid, String keyword, Integer callStatus,
            String beginDate, String endDate, String teacherUid, String projectUid, Integer status,
            int staffRole, String username
    );

    int dropBean(String storeUid, String lessonUid, Long id);

    // 获取插班、补缺、试听的会员
    String getTempMembers(String storeUid, String lessonUid, String memberUid);

    // 获取活动下的点名记录
    List<CaCallNames> listByStoreUidAndLessonUid(String storeUid, String lessonUid);

    List<CaCallNamesDto> getLessonCallNameDtos(String storeUid, String lessonUid);

    // 查找插班、补缺、试听会员已有的点名记录
    CaCallNames getTempCallName(String storeUid, String lessonUid, String memberUid);

    // 获取点名完成且是未到课/请假
    List<CaCallNamesDto> getNotReachAndAskLeaveMember(String storeUid, String scheduleUid, String lessonUid);

    // 获取插班、补缺、试听的会员数量
    long getTempMemberNum(String storeUid, String lessonUid);

    // 获取会员当月的试听次数
    long getMemberMonthAuditionCnt(String storeUid, String memberUid);

    // 设置点名完成，点名记录关联消耗的服务项目uid
    // 在定时器下加上注解，防止报错
    boolean setCallOk(
            String corpUid, String storeUid, String lessonUid, Long id,
            String orderCode, String serviceUid, String orderType, Integer isGift, Double unitAmount,
            int hourType, String hourTypeName, String staffUid, String staffName, Date closeTime
    );

    // 设置点名完成，点名记录未扣课时
    // 在定时器下加上注解，防止报错
    void setOkAnNoHour(String corpUid, String storeUid, String lessonUid, List<Long> ids, String staffUid, String staffName, Date closeTime);

    // 免费课设置点名完成
    boolean setFreeOk(String corpUid, String storeUid, String lessonUid, String staffUid, String staffName, Date closeTime);

    /**
     * 更新补缺会员的点名记录为已补缺
     *
     * @param makeupLessonUid 被补缺的活动id
     * @param lessonUid       活动的活动id
     * @return
     */
    boolean updateMemberMakeUp(String storeUid, String makeupLessonUid, String lessonUid, String memberUid);

    // 更新补缺会员的点名记录为未补缺
    boolean dropMemberMakeUp(String storeUid, String lessonUid, String memberUid);


    // 在定时器下加上注解，防止报错
    // 当天未点名记录设置为已取消
    void setCancel(String corpUid, String lessonUid, String staffUid, String staffName);

    // 删除活动下未活动或已活动的社团点名记录
    void dropClassCallName(String storeUid, Long classId, String memberUid);

    List<CaCallNames> getMemberCallListV3(String corpUid, String storeUid, String keyword, Integer callStatus,
                                          String beginDate, String endDate, String username, String projectUid, Integer status,
                                          List<Integer> callStatusList, List<Integer> hourTypeList);

    List<CaCallNamesDto> listByLessonUidIn(List<String> lessonUids);

    // 根据服务uid获取消耗的活动次数
    Map<String, Long> getCntByServiceUids(List<String> uids);

    List<CaCallNamesDto> getByServiceUidV2(String serviceUid);

    // 按活动计划uid或活动uid，删除未开始点名的点名记录
    void dropByScheduleUid(String storeUid, String scheduleUid);


    // 更新会员点名记录的服务单价
    void updateUnitAmount(String uid, double unitAmount);

    // 获取课次的点名统计
    Map<String, Map<String, Long>> hourList(List<String> lessonUidList);

    CaCallNames getByCallNamesUid(String corpUid, String storeUid, String callNamesUid);
}
